/** 16 进制颜色字符串 */
export type $HEX = `#${number | string}`;

/** rgba颜色字符串 */
export type $RGBStr = `rgba(${number},${number},${number})`;

/** rgba颜色字符串 */
export type $RGBAStr = `rgba(${number},${number},${number},${number})`;

/** 全部颜色字符串 */
export type $AllColorStr = $HEX | $RGBAStr | $RGBStr | 'transparent' | `linear-gradient(${string})` | `var(--${string})`;

/** rgba颜色对象 */
export type $RGBAObj = { r: number; g: number; b: number; a: number };

/** rgb颜色对象 */
export type $RGBObj = { r: number; g: number; b: number };

/** rgb颜色对象 */
export interface $ThemeColorObj {
  rgbaObj: $RGBAObj;
  rgbaStr: $RGBAStr;
}

/**
 * 动画方式。
 * @param linear - 动画从头到尾的速度是相同的
 * @param ease-in - 动画速度由慢到快
 * @param ease-out - 动画速度由快到慢
 * @param ease-in-out - 动画先加速到达中间点后减速到达终点
 */
export type $TimingFunction = 'ease-in-out' | 'ease-in' | 'ease-out' | 'linear';

/**
 * 支持验证数字的类型
 * @param add_int - 正整数 (不含0) 主要用于输入时验证
 * @param minus_int - 负整数(不含0) 主要用于输入时验证
 * @param all_int - 正负整数(不含0) 主要用于输入时验证
 * @param add_int_or_zero - 正整数 (含0) 主要用于输入时验证
 * @param minus_int_or_zero - 负整数 (含0) 主要用于输入时验证
 * @param all_int_or_zero - 正负整数(含0) 主要用于输入时验证
 * @param add_float - 正浮点数  主要用于输入时验证
 * @param minus_float - 负浮点数 主要用于输入时验证
 * @param all_float - 正负浮点数   主要用于输入时验证
 */
export const InputVerify = [
  'add_float',
  'add_int_or_zero',
  'add_int',
  'all_float',
  'all_int_or_zero',
  'all_int',
  'minus_float',
  'minus_int_or_zero',
  'minus_int',
] as const;
/**
 * 支持验证数字的类型
 * @param add_int - 正整数 (不含0) 主要用于输入时验证
 * @param minus_int - 负整数(不含0) 主要用于输入时验证
 * @param all_int - 正负整数(不含0) 主要用于输入时验证
 * @param add_int_or_zero - 正整数 (含0) 主要用于输入时验证
 * @param minus_int_or_zero - 负整数 (含0) 主要用于输入时验证
 * @param all_int_or_zero - 正负整数(含0) 主要用于输入时验证
 * @param add_float - 正浮点数  主要用于输入时验证
 * @param minus_float - 负浮点数 主要用于输入时验证
 * @param all_float - 正负浮点数   主要用于输入时验证
 */
export type $InputVerify = (typeof InputVerify)[number];

/**
 * 过度动画类型。
 * @param fade - 渐隐渐出过渡
 * @param slide-top - 由上至下过渡
 * @param slide-right - 由右至左过渡
 * @param slide-bottom - 由下至上过渡
 * @param slide-left - 由左至右过渡
 * @param zoom-in - 由小到大过渡
 * @param zoom-out - 由大到小过渡
 */
export const AnimationMode = [
  'fade',
  'slide-bottom',
  'slide-left',
  'slide-right',
  'slide-top',
  'zoom-in',
  'zoom-out',
  'scale-bottom',
  'scale-left',
  'scale-right',
  'scale-top',
] as const;

/**
 * 过度动画类型。
 * @param fade - 渐隐渐出过渡
 * @param slide-top - 由上至下过渡
 * @param slide-right - 由右至左过渡
 * @param slide-bottom - 由下至上过渡
 * @param slide-left - 由左至右过渡
 * @param zoom-in - 由小到大过渡
 * @param zoom-out - 由大到小过渡
 * @param scale-bottom - 从上到下缩放
 * @param scale-top - 从下到上缩放
 * @param scale-bottom - 从右到左缩放
 * @param scale-top - 从左到右缩放
 */
export type $AnimationMode = (typeof AnimationMode)[number];

/** 带单位的尺寸 */
export type $SizeUnitStr = `${number}px` | `${number}rpx`;

export type $AllSizeUnitStr = `${number}${'%' | 'px' | 'rpx' | 'vh' | 'vw'}` | `calc(${string})` | `max(${string})` | `min(${string})` | `var(--${string})`;

/** 带单位的尺寸 (类似 panding) */
export type $SizeUnitArr4Str =
  | $SizeUnitStr
  | `${$SizeUnitStr} ${$SizeUnitStr} ${$SizeUnitStr} ${$SizeUnitStr}`
  | `${$SizeUnitStr} ${$SizeUnitStr} ${$SizeUnitStr}`
  | `${$SizeUnitStr} ${$SizeUnitStr}`;

/**
 * 颜色类型
 * @param error - 错误
 * @param info - 信息
 * @param primary - 主色
 * @param success - 成功
 * @param warning - 警告
 */
export type $ColorType = 'error' | 'info' | 'primary' | 'success' | 'warning';

/**
 * 尺寸
 * @param max - 最大的
 * @param large - 较大的
 * @param middle - 适中的
 * @param small - 较小的
 * @param min - 最小的
 */
export const ButtonSize = ['max', 'large', 'middle', 'small', 'min'] as const;

/**
 * 尺寸
 * @param max - 最大的
 * @param large - 较大的
 * @param middle - 适中的
 * @param small - 较小的
 * @param min - 最小的
 */
export type $ButtonSize = (typeof ButtonSize)[number];
